#ifndef REACTOR_MSGSOCKET_H
#define REACTOR_MSGSOCKET_H

#include <QObject>
#include <queue>

#include "tcpsocket.h"

class Reactor_MsgSocket: public QObject
{
    Q_OBJECT

signals:
    void signalConnected();
    void signalDisConnected();
    void signalDownloadFile(const QJsonValue &json);
    void signalMsgToClient(const quint8 &type, const int &id, const QJsonValue &dataVal);
public slots:
    void SltSendMessage(const quint8 &type, const QJsonValue &json);
    void SltConnected();
    void SltDisconnected();
public:
    explicit Reactor_MsgSocket(TcpSocket *socket, QObject *parent = nullptr);
    ~Reactor_MsgSocket();
    int GetUserId() const;
    void Close();
    void recvCallback(char *msg); ///接受数据的回调函数 --由TcpSocket回调
    void parseTaskCallBack(void); ///解析数据的回调函数 --由ThreadPool回调
private:
    int m_nId;
    TcpSocket *m_socket;   ///使用Reactor中的TcpSocket
    std::queue<QByteArray> m_msgQueue;

    // 消息解析和抓转发处理
    void parseLogin(const QJsonValue &dataVal);
    void parseUserOnline(const QJsonValue &dataVal);
    void parseLogout(const QJsonValue &dataVal);
    void parseUpdateUserHead(const QJsonValue &dataVal);

    void parseReister(const QJsonValue &dataVal);
    void parseAddFriend(const QJsonValue &dataVal);
    void parseAddGroup(const QJsonValue &dataVal);
    void parseCreateGroup(const QJsonValue &dataVal);

    void parseGetMyFriend(const QJsonValue &dataVal);
    void parseGetMyGroups(const QJsonValue &dataVal);

    void parseRefreshFriend(const QJsonValue &dataVal);
    void parseRefreshGroups(const QJsonValue &dataVal);

    void parseFriendMessages(const QByteArray &reply);
    void parseGroupMessages(const QByteArray &reply);
};

#endif // REACTOR_MSGSOCKET_H
